package cn.bugstack.springframework.context.support;

import cn.bugstack.springframework.beans.BeansException;
import cn.bugstack.springframework.beans.factory.ConfigurableListableBeanFactory;
import cn.bugstack.springframework.beans.factory.support.DefaultListableBeanFactory;

/**
 * AbstractRefreshableApplicationContext是 Spring 框架中用于支持可刷新的应用上下文的抽象基类。
 * 它是AbstractApplicationContext的子类，提供了一些特定于刷新的功能。
 */
public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext {

    private DefaultListableBeanFactory beanFactory;

    /**
     * 使用refreshBeanFactory抽象方法可以获取DefaultListableBeanFactory的实例化，
     * 以及对资源配置的加载loadBeanDefinitions(beanFactory)，在加载完成后即可完成对spring.xml配置文件中Bean对象的定义和注册。
     * 刷新Bean工厂，重新加载Bean定义。
     * @throws BeansException 如果在刷新过程中遇到错误。
     */
    @Override
    protected void refreshBeanFactory() throws BeansException {
        // 创建一个新的Bean工厂
        DefaultListableBeanFactory beanFactory = createBeanFactory();
        // 加载Bean定义到工厂中
        // 抽象函数，由具体子类实现
        loadBeanDefinitions(beanFactory);
        // 设置当前的Bean工厂
        this.beanFactory = beanFactory;
    }

    /**
     * 创建一个新的DefaultListableBeanFactory实例。
     * @return 返回一个新创建的DefaultListableBeanFactory实例。
     */
    private DefaultListableBeanFactory createBeanFactory() {
        return new DefaultListableBeanFactory();
    }

    /**
     * 加载Bean定义到给定的Bean工厂中。这是一个抽象方法，具体实现在子类中。
     * @param beanFactory 要加载Bean定义的Bean工厂。
     */
    protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory);

    /**
     * 获取当前的Bean工厂。
     * @return 返回当前配置的ConfigurableListableBeanFactory实例。
     */
    @Override
    protected ConfigurableListableBeanFactory getBeanFactory() {
        return beanFactory;
    }

}
